#include "Utils.h"
#define STR_LEN 16

int CreateSalt(char salt[21]){
	int i,flag;
	srand(time(NULL));//通过时间函数设置随机数种子，使得每次运行结果随机。
	for(i = 0; i < STR_LEN; i ++)	{
		flag = rand()%3;
		switch(flag){
		case 0:
			salt[i] = rand()%26 + 'a';
			break;
		case 1:
			salt[i] = rand()%26 + 'A';
			break;
		case 2:
			salt[i] = rand()%10 + '0';
			break;
		}
	}
	return 0;
}

int Md5(char *pwd, char *salt, char md5_value[33]){
	// char buf[1096]="";
	// strcat(buf, pwd);
	// strcat(buf, salt);
    // MD5_CTX ctx;
    // MD5_Init(&ctx);
    // MD5_Update(&ctx,buf,strlen(buf));
    // unsigned char md[16]={0};
    // MD5_Final(md,&ctx);
    // for(int i =0;i<16;i++){
    //    sprintf(md5_value+i*2,"%02x",md[i]);
    // }
    
    OpenSSL_add_all_algorithms();
	char buf[1096]="";
    bzero(md5_value, strlen(md5_value));
	strcat(buf, pwd);
	strcat(buf, salt);
    unsigned char md5_result[EVP_MAX_MD_SIZE];
    unsigned int md5_len;
    // 创建 MD5 上下文
    EVP_MD_CTX *ctx = EVP_MD_CTX_create();
    // 初始化 MD5 上下文
    EVP_DigestInit_ex(ctx, EVP_md5(), NULL);
    // 更新上下文以包含要散列的字符串
    EVP_DigestUpdate(ctx, (unsigned char *)buf, strlen(buf));
    // 获取最终的 MD5 散列
    EVP_DigestFinal_ex(ctx, md5_result, &md5_len);
    // 打印 MD5 散列
    for (int i = 0; i < md5_len; i++) {
        sprintf(md5_value+i*2,"%02x",md5_result[i]);
    }
    // 清理并关闭上下文
    EVP_MD_CTX_destroy(ctx);
    // 清理 OpenSSL 库
    EVP_cleanup();
	return 0;
}

int ReadMd5(int fd,char md5_value[33]){
    OpenSSL_add_all_algorithms();
    char buf[1096]="";
    // MD5_CTX ctx;
    EVP_MD_CTX *ctx = EVP_MD_CTX_create();
    // MD5_Init(&ctx);
    EVP_DigestInit_ex(ctx, EVP_md5(), NULL);
    lseek(fd,0,SEEK_SET);
    while(1)
    {
        bzero(buf,sizeof(buf));
        ssize_t sret = read(fd,buf,1096);
        if(sret == 0)
        {
            break;
        }
        // MD5_Update(&ctx,buf,sret);
        EVP_DigestUpdate(ctx, buf, sret);
    }
    unsigned char md[16]={0};
    // MD5_Final(md,&ctx);
    unsigned int md5_len;
    EVP_DigestFinal_ex(ctx, md, &md5_len);
    for(int i =0;i<md5_len;i++){
       sprintf(md5_value+i*2,"%02x",md[i]);
    }
    lseek(fd,0,SEEK_SET);
    return 0;
}
int Token(char* user_name,char token_value[209])
{
    char buf[1096]="";
    char* jwt;
    size_t jwt_length;
    struct l8w8jwt_encoding_params params;
    l8w8jwt_encoding_params_init(&params);
    params.alg = L8W8JWT_ALG_HS512;
    params.sub = "Netdisk";
    params.iss = "chun";
    params.aud = "wangdao";
    params.iat = 0;
    params.exp = 0X7fffffff;
    strcat(buf,user_name);
    params.secret_key = (unsigned char*)buf;
    params.secret_key_length = strlen(buf);
    params.out = &jwt;
    params.out_length = &jwt_length;
    int r = l8w8jwt_encode(&params);
    if(r == L8W8JWT_SUCCESS)
    {
        sprintf(token_value,"%s",jwt);
    }
    else{printf("encdoging failure!\n");}
    l8w8jwt_free(jwt);
    return 0;
}

